// 重点文件，可以知道浏览器目前支持 MSE 的哪些功能
// 全是静态方法：
// (1)supportMSEH264Playback 判断全局上是否有 MediaSource 这个对象，并且需要支持 video/mp4; codecs="avc1.42E01E,mp4a.40.2"这种类型。
// 1.1 从此我们可以看出，最后 flv.js 是将 flv 格式转换成 "avc1.42E01E,mp4a.40.2" 格式了。
// 1.2 MDN 的 MediaSource 示例也给我们展示了如何通过 MediaSource 的方法和事件加载一个 mp4 文件。
// (2)supportNetworkStreamIO 通过创建一个 IOController 来判断加载器是否支持流。 （只能是 fetch-stream-loader 类型或 xhr-moz-chunked-loader 类型）
// 疑问：为什么只判断这两种？谜底我们去第二节揭晓。
// (3)getNetworkLoaderTypeName 实现和上个方法异曲同工，只不过返回的是加载器类型。
// (4)supportNativeMediaPlayback 通过创建一个 video 元素,利用它的 canPlayType 方法判断是否支持某种 mime 的数据
// (5)getFeatureList 获取支持的特性列表，分别是：
// 5.1 mseFlvPlayback MSE是否支持
// 5.2 networkStreamIO 数据流是否支持
// 5.3 networkLoaderName 数据加载器名称
// 5.4 mseLiveFlvPlayback MSE 流视频是否支持
// 5.5 nativeMP4H264Playback 原生 MP4 格式是否支持
// 5.6 nativeWebmVP8Playback 原生 Webm VP8 格式是否支持
// 5.7 nativeWebmVP9Playback 原生 Webm VP9 格式是否支持
import IOController from '../io/io-controller.js';
import {createDefaultConfig} from '../config.js';

class Features {

    static supportMSEH264Playback() {
        return window.MediaSource &&
               window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"');
    }

    static supportNetworkStreamIO() {
        let ioctl = new IOController({}, createDefaultConfig());
        let loaderType = ioctl.loaderType;
        ioctl.destroy();
        return loaderType == 'fetch-stream-loader' || loaderType == 'xhr-moz-chunked-loader';
    }

    static getNetworkLoaderTypeName() {
        let ioctl = new IOController({}, createDefaultConfig());
        let loaderType = ioctl.loaderType;
        ioctl.destroy();
        return loaderType;
    }

    static supportNativeMediaPlayback(mimeType) {
        if (Features.videoElement == undefined) {
            Features.videoElement = window.document.createElement('video');
        }
        let canPlay = Features.videoElement.canPlayType(mimeType);
        return canPlay === 'probably' || canPlay == 'maybe';
    }

    static getFeatureList() {
        let features = {
            mseFlvPlayback: false,
            mseLiveFlvPlayback: false,
            networkStreamIO: false,
            networkLoaderName: '',
            nativeMP4H264Playback: false,
            nativeWebmVP8Playback: false,
            nativeWebmVP9Playback: false
        };

        features.mseFlvPlayback = Features.supportMSEH264Playback();
        features.networkStreamIO = Features.supportNetworkStreamIO();
        features.networkLoaderName = Features.getNetworkLoaderTypeName();
        features.mseLiveFlvPlayback = features.mseFlvPlayback && features.networkStreamIO;
        features.nativeMP4H264Playback = Features.supportNativeMediaPlayback('video/mp4; codecs="avc1.42001E, mp4a.40.2"');
        features.nativeWebmVP8Playback = Features.supportNativeMediaPlayback('video/webm; codecs="vp8.0, vorbis"');
        features.nativeWebmVP9Playback = Features.supportNativeMediaPlayback('video/webm; codecs="vp9"');

        return features;
    }

}

export default Features;